/**
 * @file         bsc_uart_dispatch.h
 * @brief        串口框架_分发对象
 * @note    
 * @author       Jpz(jinpuzhao@hopechart.com, 靳普诏)
 * @data         2022-7-14
 * @version      1.0
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2022-7-14   <td>1.0                   <td>Jpz             <td>创建初始版本
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */


#ifndef _BSC_UART_DISPATCH_H_
#define _BSC_UART_DISPATCH_H_

#include "ofc/ofc_types.h"
#include "ofc/ofc_ring_buf.h"
#include "mfc/mfc_serial_vir_bus.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * 分发对象数据接收事件回调函数类型
 * @param sender:    发送者
 * @param data:      数据
 * @param data_size: 数据大小
 * @return
 */
typedef void (*TBsUartDispDoRecvEvent)(void *user_params, const Byte* data, Int32 data_size);

/**
 * 分发对象类型
 */
typedef struct TBsUartDispatchTag TBsUartDispatch;
struct TBsUartDispatchTag
{

    void                   *user_params;     // 用户自定义参数
    TBsUartDispDoRecvEvent DoRecv;          // 接收事件回调函数
    Byte                   channel;         // 关注串口通道
};


/**
 * 初始化分发对象成员变量
 * @param self：        对象指针 
 * @param filter_type： 过滤类型
 * @param channel：     关注串口通道       
 * @param object：      事件发送对象
 * @param DoRecv：      接收事件回调函数
 * @return True     设置成功
 *         False    失败，（存在 NULL 指针）
 */
Bool TBsUartDispatchSetAttr(TBsUartDispatch         *self, 
                            Byte                    channel,
                            void                    *user_params,
                            TBsUartDispDoRecvEvent  DoRecv);

/**
 * 比较两个分发对象的值是否相同 （指针不一定相同）   
 * @param *self:     分发对象1指针
 * @param *other:    分发对象2指针
 * @return True 相同；False 不同
 */
Bool TBsUartDispatchIsSame(TBsUartDispatch *self, TBsUartDispatch *other);


// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/**
 * 虚拟串口复合组件类型
 */
typedef struct TBsUartDispVirBusCompTag TBsUartDispVirBusComp;
struct TBsUartDispVirBusCompTag
{
    TMfSerialVirBus serial_vir_bus;     // 虚拟串口接口对象
    TOfRingBuf      rx_ring_buf;        // 消息缓存
    TBsUartDispatch uart_disp;          // 分发对象 获取底层串口数据流
};

/**
 * 构造函数
 * @param *self：       对象指针
 * @param channel：     串口通道号
 * @param *rx_buf：     用于接收数据的缓存
 * @param rx_buf_size： 缓存大小
 * @return == 0     成功
 *         <  0     失败，返回码参见(@ref THccAppUartDispErrorCode)[@file bsc_uart_error_code.h]
 */
Int32 TBsUartDispVirBusCompCreate(TBsUartDispVirBusComp *self, UInt8 channel, UInt8 *rx_buf, Int32 rx_buf_size);

/**
 * 析构函数
 * @param *self: 对象指针
 */
void TBsUartDispVirBusCompDestroy(TBsUartDispVirBusComp *self);

/**
 * 打开虚拟串口，注册分发对象
 * @param *self: 对象指针
 * @return == 0     成功
 *         <  0     失败，返回码参见(@ref THccAppUartDispErrorCode)[@file bsc_uart_error_code.h]
 */
Int32 TBsUartDispVirBusCompOpen(TBsUartDispVirBusComp *self);


/**
 * 关闭虚拟串口，注销分发对象
 * @param *self： 对象指针
 * @return 
 */
void TBsUartDispVirBusCompClose(TBsUartDispVirBusComp *self);

/**
 * 获取虚拟接口指针
 * @param *self: 对象指针
 * @return NULL 获取失败；否则获取成功
 */
TMfSerialVirBus *TBsUartDispVirBusCompInterface(TBsUartDispVirBusComp *self);

#ifdef __cplusplus
} // extern "C" {
#endif


#endif // #ifndef _BSC_UART_DISPATCH_H_

